Prefix-Tuning1 - 论文精读学习笔记

Prefix-Tuning: Optimizing Continuous Prompts for Generation 标签:Parameter-Efficient Fine-Tuning
论文链接:Prefix-Tuning: Optimizing Continuous Prompts for Generation
官方项目/代码:PrefixTuning
发表时间:2021
Cook
Published: 2024.09.10 | Last Updated: 2024.09.26

You are what you eat.
And I'm cooking what I eat!
:)

More food...🍜

目录

提前说明:本系列博文主要是对参考博文的解读与重述(对重点信息进行标记、或者整段摘录加深自己的记忆和理解、融合多个博文的精髓、统合不同的代表性的案例),仅做学习记录笔记使用。与君共享,希望一同进步。

 

全文梗概

本文提出一种prefix-tuning方法,其是一个轻量级的fine-tuning方法用于自然语言处理生成任务。该方法可以保持预训练语言模型参数固定(frozen),而只需要在task-specific vector(称为prefix)上进行优化。即只需要少量(约0.1%)的优化参数,即可以在量和小量数据上达到不错的效果。

Prefix-Tuning是一种微调方法,只需极少量参数就能达到全量微调的性能,适用于大模型如GPT-2。

它通过优化连续的前缀向量,减少了对模型原有参数的修改,支持多任务和低资源场景,并且在实验中表现出与全量微调相当甚至更好的效果。

摘要 完整微调需要存储所有的参数本文提出prefix-tuning,可以冻结语言模型参数,优化一系列连续的特定任务的向量,称为prefix。实验部分对GPT-2进行微调,仅修改0.1%的参数,就得到了可比较的性能,并且在低资源场景优于全量微调。

 

背景

博文2

  • 传统的fine-tuning是在大规模预训练语言模型上完成的,而大规模模型非常expensive;

    微调(Fine-tunning)是使用大型预训练语言模型执行诸如摘要的下游任务的普遍方法,但它需要替换和存储LM的所有参数,因此,构建和部署依赖于大型预训练语言模型的NLP系统,需要为每个任务存储一个修改过的语言模型参数副本,由于预训练模型都有很大的参数量,这一操作可能是非常昂贵的。
  • 一种解决这个问题的方法是采用轻量级的微调(ligthweight fine-tuning),即先固定预训练语言模型的参数,然后只对一小部分的可训练参数进行微调;

    解决这个问题的一种自然方法是轻量微调(lightweight fine-tunning),它冻结了大部分预训练参数,并用小的可训练模块来增强模型,比如在预先训练的语言模型层之间插入额外的特定任务层。适配器微调(Adapter-tunning)在自然语言理解和生成基准测试上具有很好的性能,通过微调,仅添加约2-4%的任务特定参数,就可以获得类似的性能。
  • GPT-3提出了一种不需要引入任何参数的fine-tuning方法,即in-context prompting

    GPT-3可以在不进行任何特定于任务的微调的情况下部署,即用户在任务输入前添加一个自然语言任务指令和一些示例,然后从LM生成输出。这种方法被称为情境学习(in-context learning)或提示(prompting)。
  • 受到prompt的启发,提出一种prefix-tuning方法用于生成任务上;

    本文提出了前缀微调(prefix-tunning),用于生成任务的轻量微调。前缀微调将一个连续的特定于任务的向量序列添加到输入,称之为前缀,如Figure 1 中的红色块所示。与提示(prompt)不同的是,前缀完全由自由参数组成,与真正的token不对应。相比于传统的微调,前缀微调只优化了前缀。因此,我们只需要存储一个大型Transformer和已知任务特定前缀的副本,对每个额外任务产生非常小的开销。

    Prefix-tuning(前缀微调),对于特定的任务优化一个连续的向量序列(continuous task-specific vector, called prefix),添加到每一层当中。

  • 只需要保存prefix部分的参数即可;

  • 固定预训练语言模型的大部分参数,而只对小部分的参数进行更新;

  • Controllable generation:可控生成旨在引导预训练的语言模型以匹配句子级别的属性。

全量微调成本高昂,比如GPT-2有774M个参数,GPT-3有175B个参数。

一个自然的解决方法是轻量级微调,即冻结大部分参数,只调整较小部分参数。如Adapter-tuning在模型层中间插入任务特定的层,在仅添加2—4%的参数就得到可比的性能。

对于大语言模型如GPT-3,可以采用上下文学习,不需要改变任何参数,但是受限于输入长度的限制,只适合小的训练集。

image-20240918192232143

prefix-tuning将一系列连续的特定于任务的向量添加到输入中,如Figure 1 下面部分所示。这些前缀向量并不能够映射到真正的实体token,可以理解为“虚拟token”。微调过程只更新添加的前缀向量,从而减少开销

与全量微调不同,prefix-tuning是模块化的,可以通过训练一个上游的前缀指导未修改的模型,这样一个LLM可以支持多任务。此外,这种架构可以支持一个batch中处理多用户/任务的请求。

实验部分,prefix-tuning几乎达到全量微调的效果,在低资源场景下,更是优于全量微调。

prefix-tuning是模块化的,只需要为每个用户提供独立的prefix(很方便不同用户灵活插入删除),避免了数据交叉污染(data cross-contamination)。此外,任务可以在一个batch请求中完成,这也是fine-tuning不具备的。存储空间也比finetune少1000倍。

相关工作

1 Fine-tuning for natural language generation

微调已经成为自然语言生成领域训练模型的一种普遍范式。

2 Lightweight fine-tuning

轻量级fine-tuning:Adapter-fintuning在自然语言理解和生成指标上基本和finetune相当,只增加2~4%左右任务相关的参数。

Adapter-tuning:在已经训练好的各个语言模型层当中插入额外的特定任务的层。

Lightweight fine-tuning:选择一些参数进行调整。

轻量级微调方法核心思想是冻结大部分参数,只训练少量参数以尽可能达到原来效果。

3 Prompting

常见的prompt是通过手动设计提示的方式调整模型生成。但是本文的prompt为连续前缀,更具有表现力,可以优化任务特定的prefix。

in-context learning or promting: 即GPT3中说的few-shot learning/zero-shot learning/one-shot learning.

上下文学习:一种比较极限的情况,不用修改参数。

4 Controllable generation

可控生成旨在引导预训练的语言模型匹配句子级属性,控制过程可以在训练时或者解码时进行,但是没有直接的方法对生成的内容实施细粒度的控制,如表格到文本、摘要任务等。

5 P*-tuning

所有P-tuning都是基于优化连续的prefix或者prompt的思想。调整软提示优于先前对离散提示优化的工作。Prompt-tuning的工作表明全量微调P*-tuning之间的性能差距随着模型的大小增大而消失。

 

Prefix-tuning:尝试在输入层和每一个transformer层引入预先设置好的前缀,在训练的过程中frozen模型内部参数,仅仅训练前缀。

 

方法

任务定义

本文考虑两个生成任务:table-to-text摘要任务。

table-to-text任务:输入 X 表示一个线性的表格,输出 Y 表示一个短文本;

对于摘要任务:本文使用BART模型,编码器输入source 文本 x,解码器输入target黄金摘要(y),模型预测摘要文本 y~

在传统微调方法中,模型使用预训练参数进行初始化,然后用对数似然函数进行参数更新。

(2)maxϕlogpϕ(y|x)=iYidxlogpϕ(zi|h<i)

方法:Prefix-Tuning

关于前缀/提示的设计,我们可以给模型若干的字词作为提示,比如我们想让模型生成“Obama”,那我们可以在其常见的搭配前加上上下文(例如,Barack),那么LM就会把更高的可能性分配给想要的单词。但是对于很多生成任务来说,找到合适的离散的前缀进行优化是非常困难的,尽管它的效果是不错的。

因此本文将指令优化为连续的单词嵌入,而不是通过离散的token进行优化,其效果将向上传播到所有Transformer激活层,并向右传播到后续的token。严格来说,这比离散提示符更具表达性,后者需要匹配嵌入的真实单词。

可以将token优化为连续词嵌入,而不是优化离散标记,其效果将向上传播到所有 Transformer 激活层,然后向右传播到后续标记。 这比需要匹配真实单词嵌入的离散提示更具表现力。 同时,这不如干预所有激活层的表现力,这避免了长期依赖并包括更多可调参数。因此,Prefix-Tuning优化了前缀部分对应的所有层参数。

问题陈述

image-20240918192711761

考虑文本生成的场景,输入是文本,输出是token序列,如Figure 2 右边的文本摘要任务。

Figure 2 所示的,对于自回归的模型编码器-解码器的模型,prefix-tuning采用了不同的方法添加前缀。

当然这里首先描述一下两种不同的模型架构下如何对任务进行计算:

Autoregressive LM

z=[x;y]xy 的拼接 hi(j) 表示time step i 下第 j 层Transformer layer的激活层

  1. 首先计算 hihi=LMϕ(zi,h<i)

  2. 最终计算下一个字符的概率分布,pϕ(zi+1|hi)=softmax(Wϕhi(n)),其中 Wϕ 是可训练的,将 hi(n) 映射到词汇分布的预训练矩阵

Encoder-Decoder Architecture

其中 x 由双向编码器编码,并且用解码器自回归地去预测 y ,计算方法和自回归模型类似。

Autoregressive LM

自回归模型如Figure 2 顶部所示,z=[x;y] 是输入和输出concatenation的结果,时间步 i 的激活向量为 hiRd,其中 hi=[hi(1);;hi(n)] 是当前时间步所有激活层的concatenation结果。hi 的计算如下:

(3)hi=LMϕ(zi,h<i)

hi的最后一层用于下一个token的分布 pϕ(zi+1|hi)=softmax(Wϕhi(n))

Encoder-Decoder Architecture

此外也可以采用encoder-decoder架构的模型如BART,输入通过encoder进行编码,输出通过decoder自回归预测,如如Figure 2 的下面部分所示。

Fine-tuning

如果采用fine-tuning ,对以下对数目标执行梯度更新,全量微调更新目标如下:

(4)maxϕlogpϕ(y|x)=maxϕiYidxlogpϕ(zi|h<i)

Prefix-Tuning

本文采用了Prefix-Tuning的方法来替代上文说的Fine-Tuning。

Intuition

基于提示的直觉,我们相信拥有一个适当的上下文可以在不改变LM参数的情况下引导LM。例如,如果我们希望LM生成一个单词(例如,Obama),我们可以将它的公共组合作为上下文(例如,Barack),然后LM将为所需的单词分配更高的概率。

直观地说,上下文可以通过指导从 x 中提取的内容来影响 x 的编码;并可以通过指导下一个令牌分布来影响 y 的生成。

然而,这种上下文是否存在并不明显,离散的优化在计算上具有挑战性。

本文使用在连续的嵌入空间优化前缀,这会影响后续的层和位置的预测输出,不需要更新所有的层,也不需要直接作用在整个网络上,less expensive

上下文可以引导模型生成想要的内容,但是离散的自然语言在计算上具有挑战性。因此可以考虑优化连续的词embedding,这比受限的离散的prompt更具有表现性,此外,prefix-tuning可以直接修改网络更深处的表示,从而避免跨网络深度的长计算路径(因为每一层都有)。

prompting启示我们,适当的上下文可以在不改变参数的情况下引导LM。但是通常来说,离散的“命令”可以指导专家标注,但是不能指导模型工作因此我们可以采用连续的字符嵌入来优化,即对transformer的所有层添加一个前缀

Method

对于自回归模型,调整 z = [PREFIX; x; y]

对于encoder-decoder架构,调整为 z = [PREFIX; x; PREFIX’; y]

Figure 2 所示。Pidx表示前缀prefix的下标,此时 hi 的计算如下:

(5)hi={Pθ[i,:],if iPidxLMϕ(zi,h<i),otherwise

微调时,只对前缀参数进行梯度更新。

博文4

对于上式第一行,指在前缀序列内,直接拿着一个可训练的向量 Pθ 与前缀相乘即可。

博文2 添加一个prefix,自回归模型表示为 z = [PREFIX; x; y],encoder-decoder模型表示为 z = [PREFIX; x; PREFIX’; y]

输入部分 prefix, x, y的position id分别记作 P_idx, X_idx, Y_idx;

prefix-tuning 初始化一个训练的矩阵,记作 PθR|Pidx|×dim(hi),这部分参数用于存储prefix parameters,如公式(3)所示。

即,处于前缀部分token,参数选择设计的训练矩阵,而其他部分的token,参数则固定且为预训练语言模型的参数。

训练目标为:公式(2)。

博文3

对于自回归模型,加入前缀的模型输入表示:

(6)z = [PREFIX; x; y]

对于编解码器结构的模型,加入前缀后的模型输入表示:

(7)z = [PREFIX; x; PREFIX’; y]

本文构造一个矩阵 Pθ (|Pidx|×dim(hi))去存储前缀参数,该前缀是自由参数。

(8)hi={Pθ[i,:],if iPidxLMϕ(zi,h<i),otherwise

目标函数依旧是公式(2),但是语言模型的参数是固定的,只更新前缀参数。

除此之外,作者发现直接更新前缀参数会出现不稳定的情况,甚至模型表现还有轻微的下降,因此作者对前缀参数矩阵进行重参数化

(9)Pθ[i,:]=MLPθ(Pθ[i,:])

其中 Pθ 在第二维的维数要比 Pθ 小,然后经过一个扩大维数的MLP,一旦训练完成,这些重参数化的参数就可以丢弃,只保留 Pθ

博文4

通过添加prefix给自回归网络,得到 z = [PREFIX; x; y]

或者给encoder-decoder结构生成 z = [PREFIX; x; PREFIX’; y]

|Pidx|来表示前缀的长度。

首先初始化一个可调的矩阵 PθR|Pidx|×dim(hi)

(10)hi={Pθ[i,:],if iPidxLMϕ(zi,h<i),otherwise

训练时,固定网络参数,只有前缀 θ 可调。

另外,hi 可视为 Pθ 的函数。

作者发现,直接优化参数 θ 非常不稳定,对初始化和学习率都是很敏感的。所以作者用一个小一点的矩阵 Pθ 和一个较大的前馈网络 MLPθ 来组成 Pθ

Parametrization of Pθ

直接更新 Pθ 会导致优化(训练)不稳定,并且性能也会降低。因此通过一个大型的前馈神经网络( MLPθ )组成的较小矩阵 Pθ 重新参数化矩阵 Pθ[i,:]=MLPθ(Pθ[i,:]) 。请注意, PθPθ 具有相同的行(即前缀长度),但不同的列。一旦训练完成,可以删除这些重处理参数 PθMLPθ ,并且只需要保存前缀参数 Pθ 。(这样可训练参数就变成了 PθMLPθ 。训练结束后只保存前缀参数 Pθ

 

实验设置

数据集和指标

作者在三个数据集上评估表格到文本的任务,在XSUM数据集上评估摘要任务,如Table 1 所示:

image-20240918195300577

table-to-text任务:

  • 数据集:E2E,WebNLG,DART

  • 指标:BLEU, METEOR, TER, Mover-Score, BERTScore, BLEURT

摘要任务:

  • 数据集:XSum

  • 指标: ROUGE-1, ROUGE-2, ROUGE-L

方法

对于表格到文本生成任务,作者对比了全量微调FT-top2adapter-tuning三种方法。此外对于每个数据集的SOTA方法也进行了对比。

结构和超参数

表格到文本生成任务上,作者采用了GPT-2MEDIUMGPT-2LARGE模型,对于文本摘要生成任务,采用 BARTLARGE模型。

超参数的设置附录中有。

训练中,无论时间还是空间效率,Prefix-tuning都要略胜一筹。

 

主要结果

Table-to-text Generation 任务

实验发现仅仅更新0.1%的任务特定参数,就能够超越其它轻量级baseline,达到与全量微调可比的性能。

image-20240918195759232

当把可训练参数都调整为0.1%时,可以发现prefix-tuning明显优于ADAPTER。此外,在DART上获得良好的性能表明prefix-tuning可以推广到不同领域的大量关系表中。

总的来说,prefix-tuning应用到自回归模型上,高效且节约时间,并且随着模型规模的夸大,性能仍能提升,说明其有潜力扩展到更大的模型。

博文2

实验对比了标准fine-tunine,主要在E2E、WebNLG和DART三个table-to-text任务上实现。发现prefix-tuning有所提升,如Table 2

Summarization任务

image-20240918195832752

摘要任务结果如Table 3 所示,prefix-tuning和全量微调还是有差距,这与文本生成任务的结果有所不同,有如下几点原因:

Low-data Setting(低资源分析)

为了更系统探索低资源场景设置,作者的对数据集进行了二次采样,获得大小为50、100、200、500的数据,每组数据都采样五种不同的数据集。

image-20240918195949799

Figure 3 右边可以看出低资源场景下prefix-tuning的性能优于全量微调,但是随着数据集增加差距会减小。

Extrapolation

这里探索泛化性能,即在未见的主题上的表现能力。作者对数据集进行了重新划分,使部分类别仅在测试时出现。table-to-text数据集分割WebNLG,摘要任务将数据集分为新闻-to-体育(新闻上训练,体育上测试),以及新闻内数据(部分领域上训练,其它领域上测试)。

image-20240918200047803

结果见Table 2 中间U部分和Table 4 ,prefix-tuning性能都比全量微调要好。

 

Intrinsic Evaluation

Prefix Length(前缀长度分析)

较长的前缀表明可训练参数的增加,性能会随着提升。

image-20240918200338783

不同任务前缀长度阈值不同,超过阈值容易过拟合。

Full vs Embedding-only

image-20240918200419527

根据Table 5 可以看出,仅微调embedding的表现力不够,但也优于离散提示优化,模型表达能力有着如下的规律: 离散提示 < embedding-only < prefix-tuning 

这里的full意思是指在模型的每一层前面都添加前缀,而embedding-only仅在输入embedding前加入prefix,这样的表现力是不够的。

Prefix-tuning vs Infix-tuning

此外,作者还研究了可训练的参数在序列中位置的影响。Table 5 下面部分是Infix的结果,性能略低于prefix-tuning,可能原因是前者只能影响y,而后者可以影响x和y。

Initialization

image-20240918200624089

随机初始化在低资源场景对结果有很大影响,性能低、方差大,使用真实单词初始化(特别是任务相关)可以调高生成速度。在完整训练场景下,初始化没有影响。

Data Efficiency

此外作者还比较了不同的数据规模下,prefix-tuning和全量微调的比较。

image-20240918200701668

超过20%数据上,prefix-tuning比全量微调要好,10%的数据规模,随机初始化的prefix-tuning和全量微调效果类似,因此需要初始化技巧来提高性能。

 

讨论

Personalization

当大量任务需要独立训练,又面临用户隐私问题时,可以采用prefix-tuning这种模块化方式,通过添加或删除用户的prefix来灵活添加、删除用户。

Batching across users

在相同的个性化设置下,prefix-tuning允许批量处理用户的请求,即在用户输入前面加上个性化前缀,从而提高效率。

Inductive bias of prefix-tuning

保留LM参数有助于泛化到未见过的领域,但是如何进一步改进是一个问题。prefix-tuning和adapter都保留了LM的完整,影响Transformer的激活层。但是前者只需要更少的参数就可以保持可比的性能,作者认为前缀调整尽可能保持预训练的LM完整。

 

补充

博文1 作为LLM参数有效性学习的经典文章,prefix-tuning思路清晰,方法简单,效果惊人。作者借鉴prompt的思想,在模型的每一层前面加上可训练的前缀参数,并在训练中冻结其它参数,这种每一层都加上前缀的方式,恰如每一层都对后面的序列进行指令微调,层层递进,因此效果显著。实验部分通过两个场景的任务,先是和全量微调、adapter进行对比,再比较prefix的位置,prefix的长度,低资源场景设置,但是实验往往追求广而深,作者深度显然是够了,但是不够广,作者只在两个NLP任务、4个数据集上进行实验,要是能够在更多任务上进行对比,那么就更具有说服力了。此外,作者忽略了加入prefix,token序列长度进一步被压缩的限制。最后还有一点我个人的想法,如果能够将prefix调整的过程可视化,观察prefix究竟是怎样的变化过程,以及到底有多少参数是真正参与到微调的过程,那么就能够知道prefix最合适的长度范围了,当然这也是任务相关的。

总结

博文3 本文提出一种更好的微调方法,通过加入前缀实现统一模型在不同任务上的微调,实现小样本学习,极大地减少了参数量。目前对于前缀的构造,大致可以分为本文的连续前缀离散前缀(自动生成或手动设计),对于在摘要任务上加入离散前缀,有点类似于从对话中提取特征或结构,但这种方法的优势就在于它不需要大量的样本,而传统的融入结构的方法仍然需要很多样本。感觉这种方法可能是摘要任务之后的趋势之一。

 

参考博文

  1. 【NLP经典论文精读】Prefix-Tuning: Optimizing Continuous Prompts for Generation

    点评:★★★★☆,基本上是对全文的整体介绍

  2. 论文解读:Prefix-Tuning: Optimizing Continuous Prompts for Generation

    点评:★★★☆☆,对博文1进行了一些简单的补充

  3. 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》阅读笔记

    点评:★★★☆☆,对一些其他博文中的细节进行了补充,发现了一个很有意思的现象,同样是一个实验结果或者一段英文描述,不同人的看法却可能大不相同,有的描述甚至完全不一样。看来先知识这个概念真的很work!有先验知识的人可能看得更深,说的更明白吧!

  4. Prefix-Tuning, Optimizing Continuous Prompts for Generation

    点评:★★★☆☆,同博文2的作用一样吧~

  5. Prefix-Tuning: Optimizing Continuous Prompts for Generation

    点评:★★★☆☆,虽然内容不多,但是感觉对一些问题的认识更深些

 

博文免责声明

  1. 本条博文信息主要整合自网络,部分内容为自己的理解写出来的,如有断章截句导致不正确或因个人水平有限未能详尽正确描述的地方,敬请各位读者指正;

  2. 引用出处可能没有完全追溯到原始来源,如因此冒犯到原创作者,请联系本人更正/删除;

  3. 博文的发布主要用于自我学习,其次希望帮助到有共同疑惑的朋友。

欢迎随时联系讨论,一起成长进步。

 


1 Li X L, Liang P. Prefix-tuning: Optimizing continuous prompts for generation[J]. arXiv preprint arXiv:2101.00190, 2021.